using System.IO;
using System.Collections.Generic;

namespace Infrastructure
{
    /// <summary>
    /// 文件操作的辅助类
    /// </summary>
    public static class FileHelper
    {
        /// <summary>
        /// 如果存在指定的文件，则删除。
        /// </summary>
        /// <param name="path">文件路径</param>
        public static void DeleteFile(string path)
        {
            if (File.Exists(path))
            {
                File.Delete(path);
            }
        }

        /// <summary>
        /// 读取指定的文件。
        /// 文件存在则读取，否则返回一个空数组。
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>文件字节数组</returns>
        public static byte[] ReadAllBytes(string path)
        {
            byte[] bytes = new byte[] { };

            // 文件存在
            if (File.Exists(path))
            {
                // 将文件读取到字节数组
                bytes = File.ReadAllBytes(path);
            }

            return bytes;
        }

        /// <summary>
        /// 读取指定的文件。
        /// 文件存在则读取，否则返回一个空数组。
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>一个字符串数组，包含文件中的所有行</returns>
        public static string[] ReadAllLines(string path)
        {
            string[] lines = new string[] { };

            // 文件存在
            if (File.Exists(path))
            {
                // 读取文件
                lines = File.ReadAllLines(path);
            }

            return lines;
        }

        /// <summary>
        /// 读取指定的文件。
        /// 文件存在则读取，否则返回一个空字符串。
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns>文件文本</returns>
        public static string ReadAllText(string path)
        {
            string text = null;

            // 文件存在
            if (File.Exists(path))
            {
                // 读取文件
                text = File.ReadAllText(path);
            }

            return text;
        }

        /// <summary>
        /// 保存文件。
        /// </summary>
        /// <param name="path">要写入的文件路径</param>
        /// <param name="text">要写入的文本</param>
        public static void SaveFile(string path, string text)
        {
            using (StreamWriter writer = new StreamWriter(path))
            {
                writer.Write(text);
            }
        }

        /// <summary>
        /// 保存文件。
        /// 文件已存在则覆盖文件。
        /// </summary>
        /// <param name="path">要写入的文件路径</param>
        /// <param name="bytes">文件内容的字节数据</param>
        public static void SaveFile(string path, byte[] bytes)
        {
            SaveFile(path, bytes, FileMode.Create);
        }

        /// <summary>
        /// 向现有文件追加内容。
        /// 文件不存在则创建文件。
        /// </summary>
        /// <param name="path">要写入的文件路径</param>
        /// <param name="bytes">文件内容的字节数据</param>
        public static void AppendFile(string path, byte[] bytes)
        {
            SaveFile(path, bytes, FileMode.Append);
        }

        /// <summary>
        /// 如果指定的路径不存在，创建指定路径中的所有目录。
        /// </summary>
        /// <param name="path">要创建的目录。</param>
        /// <returns>一个对象，表示指定路径的目录。如果路径已存在，则返回空值。</returns>
        public static DirectoryInfo CreateDirectoryIfNotExists(string path)
        {
            // 路径已存在
            if (Directory.Exists(path))
                return null;

            // 创建目标
            return Directory.CreateDirectory(path);
        }

        #region Private Method

        /// <summary>
        /// 保存文件。
        /// </summary>
        /// <param name="path">要写入的完整文件路径</param>
        /// <param name="bytes">文件内容的字节数据</param>
        /// <param name="fileMode">操作文件的模式</param>
        private static void SaveFile(string path, byte[] bytes, FileMode fileMode)
        {
            FileStream fileStream = new FileStream(path, fileMode, FileAccess.Write);
            fileStream.Write(bytes, 0, bytes.Length);
            fileStream.Flush();
            fileStream.Close();
        }

        #endregion
    }
}
